/***********************************************************************
 * Module:  DAOStationnement.java
 * Author:  Simon
 * Purpose: Defines the Class DAOStationnement
 ***********************************************************************/

package DAO;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.*;

import Modele.Stationnement;

/** Data Access Object d'accès aux stationnements */
public class DAOStationnement {
	/**
	 * Renvoie la liste de tous les stationnements
	 * 
	 * @return La liste de stationnements
	 */
	public static ArrayList<Stationnement> getAllStationnement() {
		Statement stat;
		ArrayList<Stationnement> stationnements = new ArrayList<Stationnement>();
		try {

			stat = DAO.getConnection().createStatement();
			stat.executeUpdate("use nemovelo");
			ResultSet res = stat.executeQuery("select * from Stationnement");

			Stationnement stationnement;
			int idStationnement, idVelo, idStation;
			Date dateDeDebut, dateDeFin;
			while (res.next()) {

				idStationnement = res.getInt("idStationnement");
				idStation = res.getInt("idStation");
				idVelo = res.getInt("idVelo");
				dateDeDebut = res.getDate("dateDeDebut");
				dateDeFin = res.getDate("dateDeFin");

				stationnement = new Stationnement(idStationnement, idVelo,
						idStation, dateDeDebut, dateDeFin);

				stationnements.add(stationnement);
			}

		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}

		return stationnements;
	}

	/**
	 * Renvoie un stationnement en fonction de son identifiant
	 * 
	 * @param idStationnement
	 *            Identifiant du stationnement demandé Le stationnement demandé
	 * @return Le stationnement demandé
	 */
	public static Stationnement getStationnementById(int idStationnement) {
		Statement stat;
		Stationnement stationnement = null;

		try {

			stat = DAO.getConnection().createStatement();
			stat.executeUpdate("use nemovelo");
			ResultSet res = stat.executeQuery("select * from Stationnement");

			int idVelo, idStation;
			Date dateDeDebut, dateDeFin;
			if (res.next()) {

				idStationnement = res.getInt("idStationnement");
				idStation = res.getInt("idStation");
				idVelo = res.getInt("idVelo");
				dateDeDebut = res.getDate("dateDeDebut");
				dateDeFin = res.getDate("dateDeFin");

				stationnement = new Stationnement(idStationnement, idVelo,
						idStation, dateDeDebut, dateDeFin);

			}

		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}

		return stationnement;
	}

	/**
	 * Met à jour un stationnement dans la base
	 * 
	 * @param stationnement
	 *            L'agent de maintenance à mettre à jour
	 */
	public static void updateStationnement(Stationnement stationnement) {
		PreparedStatement stat;
		try {
			stat = DAO.getConnection().prepareStatement(
					"select * from Stationnement where idStationnement=?",
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_UPDATABLE);

			stat.setInt(1, stationnement.getIdStationnement());
			ResultSet res = stat.executeQuery();

			if (res.next()) {

				res.updateInt("idStation", stationnement.getIdStation());
				res.updateInt("idVelo", stationnement.getIdVelo());
				res.updateDate("dateDeDebut", new java.sql.Date(stationnement
						.getDateDeDebut().getTime()));
				res.updateDate("dateDeFin", new java.sql.Date(stationnement
						.getDateDeFin().getTime()));

				res.updateRow();

			}

		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}
	}

	/**
	 * Supprime un stationnement de la base
	 * 
	 * @param stationnement
	 *            L'agent de maintenance à supprimer
	 */
	public static void deleteStationnement(Stationnement stationnement) {
		Statement stat;
		try {

			stat = DAO.getConnection().createStatement();

			stat.executeUpdate("delete from Stationnement where idStationnement="
					+ stationnement.getIdStationnement());

		} catch (SQLException e) {

			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}
	}

	/**
	 * Insère un nouveau stationnement dans la base
	 * 
	 * @param stationnement
	 *            L'agent de maintenance à insérer
	 */
	public static void insertStationnement(Stationnement stationnement) {
		PreparedStatement stat;
		try {
			stat = DAO
					.getConnection()
					.prepareStatement(
							"insert into Stationnement (idStation,idVelo,dateDeDebut,dateDeFin) values (?,?,?,?)");

			stat.setInt(1, stationnement.getIdStation());
			stat.setInt(2, stationnement.getIdVelo());
			stat.setDate(3, new java.sql.Date(stationnement.getDateDeDebut()
					.getTime()));
			if (stationnement.getDateDeFin() != null)
				stat.setDate(4, new java.sql.Date(stationnement.getDateDeFin()
						.getTime()));
			else
				stat.setNull(4, Types.NULL);

			stat.executeUpdate();

		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}

	}

}